package org.fanximall.erp.product.infrastructure.repository;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.fanximall.erp.common.base.BaseDO;
import org.fanximall.erp.common.page.PageResponse;
import org.fanximall.erp.product.domain.aggregate.AttributeAggregateRoot;
import org.fanximall.erp.product.domain.dto.AttributeItemPageQueryDTO;
import org.fanximall.erp.product.domain.model.AttributeItemModel;
import org.fanximall.erp.product.domain.model.AttributeValueModel;
import org.fanximall.erp.product.domain.repository.AttributeRepository;
import org.fanximall.erp.product.infrastructure.builder.AttributeBuilder;
import org.fanximall.erp.product.infrastructure.dao.entity.ProductConfAttributeItemsDO;
import org.fanximall.erp.product.infrastructure.dao.entity.ProductConfAttributeValueDO;
import org.fanximall.erp.product.infrastructure.dao.mapper.ProductConfAttributeItemsMapper;
import org.fanximall.erp.product.infrastructure.dao.mapper.ProductConfAttributeValueMapper;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author :  william
 * @version :  V1.0  created in 2024/4/23
 */
@Repository
public class AttributeRepositoryImpl implements AttributeRepository {

    @Resource
    private ProductConfAttributeItemsMapper attributeItemsMapper;

    @Resource
    private AttributeBuilder attributeBuilder;

    @Resource
    private ProductConfAttributeValueMapper confAttributeValueMapper;


    @Override
    public boolean existAttributeItem(String itemName, String typeCode) {
        Long count = attributeItemsMapper.selectCount(new LambdaQueryWrapper<ProductConfAttributeItemsDO>()
                .eq(ProductConfAttributeItemsDO::getName, itemName).eq(ProductConfAttributeItemsDO::getAttrTypeDict, typeCode));
        return null != count && count>0;
    }

    @Override
    public void saveAttributeItem(AttributeItemModel attribute) {
        ProductConfAttributeItemsDO productConfAttributeItemsDO = attributeBuilder.productConfAttributeItemsBuild(attribute);
        attributeItemsMapper.insert(productConfAttributeItemsDO);
        attribute.setId(productConfAttributeItemsDO.getId());

    }

    @Override
    public void updateAttributeItem(AttributeItemModel attribute) {
        ProductConfAttributeItemsDO productConfAttributeItemsDO = attributeBuilder.productConfAttributeItemsBuild(attribute);
        attributeItemsMapper.updateById(productConfAttributeItemsDO);
    }

    @Override
    public PageResponse<AttributeItemModel> pageQueryAttributeItem(AttributeItemPageQueryDTO attributeItemPageQueryDTO) {
        Page<ProductConfAttributeItemsDO> page = new Page<>(attributeItemPageQueryDTO.getCurrent(), attributeItemPageQueryDTO.getSize());
        LambdaQueryWrapper<ProductConfAttributeItemsDO> queryWrapper = Wrappers.lambdaQuery(ProductConfAttributeItemsDO.class);
        queryWrapper.eq(ObjectUtils.isNotEmpty(attributeItemPageQueryDTO.getState()), ProductConfAttributeItemsDO::getState, attributeItemPageQueryDTO.getState())
                .eq(StringUtils.isNotBlank(attributeItemPageQueryDTO.getAttrTypeDict()), ProductConfAttributeItemsDO::getAttrTypeDict, attributeItemPageQueryDTO.getAttrTypeDict())
                .like(StringUtils.isNotBlank(attributeItemPageQueryDTO.getName()), ProductConfAttributeItemsDO::getName, attributeItemPageQueryDTO.getName()).
                orderByAsc(BaseDO::getCreateTime);
        Page<ProductConfAttributeItemsDO> productConfAttributeItemsPage = attributeItemsMapper.selectPage(page, queryWrapper);
        List<ProductConfAttributeItemsDO> records = productConfAttributeItemsPage.getRecords();
        List<AttributeItemModel> attributeItemModels = attributeBuilder.attributeItemModelBuildList(records);

        return new PageResponse<>(attributeItemPageQueryDTO.getCurrent(),attributeItemPageQueryDTO.getSize(),productConfAttributeItemsPage.getTotal(),attributeItemModels);
    }

    @Override
    public AttributeAggregateRoot getAttributeByAttributeItemId(Long attributeId) {
        ProductConfAttributeItemsDO productConfAttributeItemsDO = attributeItemsMapper.selectById(attributeId);
        List<ProductConfAttributeValueDO> productConfAttributeValueDOS = confAttributeValueMapper.selectList(Wrappers.lambdaQuery(ProductConfAttributeValueDO.class)
                .eq(ProductConfAttributeValueDO::getAttrItemId, attributeId));
        return AttributeAggregateRoot.builder()
                .attributeItemModel(attributeBuilder.attributeItemModelBuild(productConfAttributeItemsDO))
                .attributeValueModel(attributeBuilder.attributeValueBuild(productConfAttributeValueDOS))
                .build();
    }


    @Override
    public void batchSaveAttributeValue(List<AttributeValueModel> attributeValues) {
        confAttributeValueMapper.batchInsert(attributeBuilder.productConfAttributeValueBuild(attributeValues));
    }

    @Override
    public List<AttributeValueModel> getAttributeItemValue(Long attributeItemId) {
        List<ProductConfAttributeValueDO> productConfAttributeValueDOS = confAttributeValueMapper.selectList(new LambdaQueryWrapper<ProductConfAttributeValueDO>().eq(ProductConfAttributeValueDO::getAttrItemId, attributeItemId));
        return attributeBuilder.attributeValueBuild(productConfAttributeValueDOS);
    }

    @Override
    public void batchDeleteAttributeValue(List<Long> ids) {
        confAttributeValueMapper.deleteBatchIds(ids);
    }
}
